/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package nadesicoi

import java.util.zip.*;
import javax.swing.*
import groovy.sql.*
/**
 *
 * @author Usuario
 */
class ActualizadorNadro {
    static def db
	static def start() {
        try {
            def URLNad = Main.config.URLNadroCatalogo[0].text()
            def IDAlm  = Main.config.IDAlmacen[0].text()
            //println "Comienza actualización nadro"
            Util.descargar(URLNad, "autoIIc.exe")
            Util.descomprimir("autoIIc.exe", "")
            //println "Descarga y compresión completadas"
            conectarBD()
            def detalles = cargar(IDAlm, "autoIIc.dat")

            //println "Termina actualización nadro"
            Consola.aviso("Información de Nadro Actualizada", detalles)
            return true
        } catch(e) { Consola.error("Error cachado: "+ e.message, e); return false }
    }
    static def cargar = { IDAlmacen, origen ->
        def linea, artic, ID, detalles = new StringBuffer()
        try {
        def file = (new File(origen)).eachLine {
            try {
                linea = extraeLineaCat(it)
                if(linea.codigo != "") {
                    artic = db.firstRow("SELECT id_articulo FROM articulos WHERE codigo = ?", [linea.codigo])
                } else {
                    artic = db.firstRow("SELECT id_articulo FROM articulos WHERE descripcion = ?", [linea.descripcion]) }

                if(artic == null) { detalles << "\nIgnorando artículo que no está en el catálogo\n" } else {
                    ID = artic.id_articulo
                    detalles << ".$ID"
                    db.executeUpdate("UPDATE precios SET costo = ? WHERE id_articulo = ? AND id_almacen = ?", [linea.precioFarSI, ID, IDAlmacen])
                }
            } catch(NullPointerException e) {
                throw new Exception("Error al insertar")
            } catch(e) {
                if(e.message.contains("Duplicate entry")) { println "Duplicada: ${e.message}"  } else { throw new Exception("Error al insertar: "+e.message) } }
        }
        db.commit()
        } catch(e2) { db.rollback(); println "Error. Cambios revertidos. ${e2.message}"; e2.printStackTrace() }
        db.close()
        detalles
    }
    static def extraeLineaCat(linea) {
        def retorna = [:]
        retorna['tipoMov']     = linea[0..0]
        retorna['codigoNadro'] = linea[1..8]
        retorna['familia']     = linea[9..9]
        retorna['departamento']= linea[10..10]
        retorna['categoria']   = linea[11..11]
        retorna['clvVencimien']= linea[13..13]
        retorna['clvRefrig']   = linea[14..14]
        retorna['clvCtrolSSA'] = linea[15..15]
        retorna['catIVA']      = linea[16..16]
        retorna['descripcion'] = linea[17..51]
        retorna['laboratorio'] = linea[52..61]
        retorna['precioPubSI'] = Double.valueOf(linea[62..70])/100     //Precio público sin IVA
        retorna['precioFarSI'] = Double.valueOf(linea[71..79])/100     //Precio Farmacia sin IVA
        retorna['identPECE']   = linea[80..80]					   //Identificación del PECE 1989
        retorna['fechaUltMov'] = linea[81..86] 				  	   //Fecha último movimiento
        retorna['codigo']      =(linea.size()==87)? "" : linea[87..99] //Código de Barras EAN
        retorna
    }

    static def conectarBD = { ->
        def servSql  = "localhost"
        def bdName   = "omoikane"
        def userDB   = "root"
        def contraDB = ""

        try { db = Sql.newInstance("jdbc:mysql://$servSql/$bdName?user=$userDB&password=$contraDB", userDB, contraDB, "com.mysql.jdbc.Driver")
            db.connection.autoCommit = false
            println "Conectado a mysql"
         } catch(e) { throw new Exception("Excepción al conectarse a MySQL", e) }
    }
}

